package com.triones.ljr.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.triones.ljr.entity.dto.PolicyOptionCategoryDO;
import com.triones.ljr.entity.dto.PolicyOptionDataDO;
import com.triones.ljr.entity.vo.PolicyOptionCategoryVO;
import com.triones.ljr.entity.vo.PolicyOptionDataVO;
import com.triones.ljr.mapper.PolicyOptionCategoryMapper;
import com.triones.ljr.mapper.PolicyOptionDataMapper;
import com.triones.ljr.service.PolicyOptionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 政策选项
 */
@Service
@RequiredArgsConstructor
public class PolicyOptionServiceImpl implements PolicyOptionService {

    private final PolicyOptionDataMapper policyOptionDataMapper;

    private final PolicyOptionCategoryMapper policyOptionCategoryMapper;

    @Override
    public TableDataInfo<PolicyOptionCategoryVO> categoryPageList(PageQuery pageQuery) {
        LambdaQueryWrapper<PolicyOptionCategoryDO> lqw = Wrappers.lambdaQuery();
        lqw.eq(PolicyOptionCategoryDO::getIsDel, "0");
        Page<PolicyOptionCategoryVO> result = policyOptionCategoryMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    @Override
    public TableDataInfo<PolicyOptionDataVO> pageList(PolicyOptionDataDO dto, PageQuery pageQuery) {
        LambdaQueryWrapper<PolicyOptionDataDO> lqw = Wrappers.lambdaQuery();
        lqw.eq(ObjectUtil.isNotNull(dto.getCid()),PolicyOptionDataDO::getCid, dto.getCid())
            .like(StringUtils.isNotBlank(dto.getName()),PolicyOptionDataDO::getName, dto.getName())
            .eq(PolicyOptionDataDO::getIsDel, "0")
            .orderByAsc(PolicyOptionDataDO::getSort);
        Page<PolicyOptionDataVO> result = policyOptionDataMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    @Override
    public PolicyOptionDataVO getInfo(Long id) {
        return policyOptionDataMapper.selectVoById( id);
    }

    @Override
    public boolean checkNameUnique(PolicyOptionDataDO dto) {
        boolean exist = policyOptionDataMapper.exists(new LambdaQueryWrapper<PolicyOptionDataDO>()
            .eq(PolicyOptionDataDO::getName, dto.getName())
            .eq(PolicyOptionDataDO::getCid, dto.getCid())
            .eq(PolicyOptionDataDO::getIsDel, "0")
            .ne(ObjectUtil.isNotNull(dto.getId()), PolicyOptionDataDO::getId, dto.getId()));
        return !exist;
    }

    @Override
    public boolean add(PolicyOptionDataDO dto) {
        return policyOptionDataMapper.insert(dto) > 0;
    }

    @Override
    public boolean edit(PolicyOptionDataDO dto) {
        return policyOptionDataMapper.updateById(dto) > 0;
    }

    @Override
    public boolean remove(Long id) {
        PolicyOptionDataDO policyOptionDataDO = policyOptionDataMapper.selectById(id);
        if (policyOptionDataDO == null) {
            throw new ServiceException("信息不存在");
        }
        policyOptionDataDO.setIsDel("1");
        return policyOptionDataMapper.updateById(policyOptionDataDO) > 0;
    }

    @Override
    public List<PolicyOptionCategoryVO> selectCategoryAll() {
        LambdaQueryWrapper<PolicyOptionCategoryDO> lqw = new LambdaQueryWrapper<PolicyOptionCategoryDO>();
        lqw.eq(PolicyOptionCategoryDO::getIsDel, "0");
        return policyOptionCategoryMapper.selectVoList(lqw);
    }

    @Override
    public PolicyOptionCategoryVO getCategoryInfo(Long id) {
        return policyOptionCategoryMapper.selectVoById( id);
    }

    @Override
    public List<PolicyOptionDataVO> optionDataListByCid(Long cid) {
        LambdaQueryWrapper<PolicyOptionDataDO> lqw = new LambdaQueryWrapper<PolicyOptionDataDO>();
        lqw.eq(PolicyOptionDataDO::getIsDel, "0")
            .eq(PolicyOptionDataDO::getCid, cid)
            .orderByAsc(PolicyOptionDataDO::getSort);
        return policyOptionDataMapper.selectVoList(lqw);
    }
}
